package com.atguigu.shardingjdbcdemo.algorithm;

import com.google.common.collect.Range;
import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;

/**
 * @author zhaojiaxu
 * @date 2021/10/21 08:52
 **/
public class ComplexDatabaseShardingAlgorithm implements ComplexKeysShardingAlgorithm<Integer> {
    @Override
    public Collection<String> doSharding(Collection<String> collection, ComplexKeysShardingValue<Integer> complexKeysShardingValue) {

        // 过滤数据源
        // 作用：散列到具体的哪个库里面去
        // shardingValue ： SQL -> INSERT INTO  course VALUES (cid,user_id,cname)
        // 根据user_id 对总的数据源取余，奇数放在edu_db_1数据库  偶数放在edu_db_2数据库 (对应场景不同租户放在对应自己的数据库中)
        // 根据cid 来分表
        //需要分片的数据源结合
        Collection<String> shardingDS = new ArrayList<>();
        //最后返回的集合
        Collection<String> finalDS = new ArrayList<>();
        for (String database : collection) {

            //  此方法如果参数所表示的字符序列是由该对象表示的字符序列的后缀返回true, 否则为false;
            //  请注意，如果参数是空字符串或等于此String对象由equals（Object）方法确定结果为 true。
            //  String Str = new String("This is really not immutable!!");   retVal = Str.endsWith( "immutable!!" )
            //  为true
            //  ds0.startsWith("d") -> true ; d代表course类型数据库  u代表用户类型数据库


            if (database.startsWith("d")) {
                shardingDS.add(database);

            }


        }
        // 精准分库
        Collection<Integer> user_id = complexKeysShardingValue.getColumnNameAndShardingValuesMap().get("user_id");
        if (user_id != null && user_id.size() > 0) {
            Integer userId = user_id.iterator().next();
            //进行取余算法，偶数分到edu_db_1 奇数分到edu_db_2中去
            int i = (userId % shardingDS.size() + 1);
            for (String sharding : shardingDS) {
                if (sharding.endsWith((i + ""))) {
                    finalDS.add(sharding);
                    return finalDS;
                }
            }
        }


        // 范围分库
        Map<String, Range<Integer>> columnNameAndRangeValuesMap = complexKeysShardingValue.getColumnNameAndRangeValuesMap();
        if (columnNameAndRangeValuesMap != null && columnNameAndRangeValuesMap.size() > 0  ) {
            return shardingDS;
        }
        throw new UnsupportedOperationException();
    }

}